perm filename XREFS.SAI[PUB,REG] blob sn#195750 filedate 1976-01-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGOF("XREFS")
C00003 00003	PUBLIC SIMPLE PROCEDURE XREFS! $"#
C00004 00004	PUBLIC SIMPLE PROCEDURE FINIXREFS $"#
C00006 00005	PUBLIC BOOLEAN SIMPLE PROCEDURE LABELDEF $"#
C00009 00006	PUBLIC STRING SIMPLE PROCEDURE LABELREF(INTEGER USYMB, LEN) $"#
C00012 00007	FINISHED
C00013 ENDMK
C⊗;
BEGOF("XREFS")

COMMENT

                *** Variations at Different Sites ***

TENEX PUB has a different naming scheme for intermediate files.

                                 ***


Labels and cross-references.  Page labels are the trickiest because
they are always forward references, but they are resolved as soon as
the page is written out.

;

PROCEDURES
PUBLIC SIMPLE PROCEDURE XREFS! ;$"#
BEGIN "XREFS!"
PLBL ← BRKPLBL ← -TWO(13) ;
END "XREFS!" ;
PUBLIC SIMPLE PROCEDURE FINIXREFS ;$"#
BEGIN "FINIXREFS"
COMMENT Write out Labels for Pass Two ;
L ← WRITEON(FALSE, IFC TENEX THENC IFILENAME&".LABELS" ELSEC "PULABL"&PUIEXT ENDC) ;
OUT(L, CVSR(XSYMNO MAX IHIGH) ) ;
FOR J ← 1 THRU XSYMNO DO
    IF (BYTEWD ← NUMBER[J]) NEQ 0  AND (K← LDB(SYMBOLWD(BYTEWD))) = 0 OR K='17777 THEN
	IF LDB(PLIGHTWD(BYTEWD)) = 2 THEN OUT(L, CVSR(0) & CVSR(J) & STBL[LDB(IXWD(BYTEWD))]&ALTMODE )
	ELSE WARN("=","Undefined Label "&SYM[J]) ;
FOR J ← 1 THRU IHIGH DO IF LH(BYTEWD ← ITBL[J]) = '400000 THEN
	OUT(L, CVSR(1) & CVSR(J) & STBL[LDB(IXWD(BYTEWD))] & ALTMODE) ;
RELEASE(L) ;
END "FINIXREFS" ;
PUBLIC BOOLEAN SIMPLE PROCEDURE LABELDEF ;$"#
IF  NOT NEXTSCH(:) THEN RETURN(FALSE)
ELSE IF  NOT ON THEN
	BEGIN
	WHILE THISISID AND NEXTSCH(:) DO BEGIN PASS ; PASS END ;
	IF NOT NEXTSTATEMENT THEN E(0, 0) ;  RETURN(TRUE) ;
	END
ELSE
BEGIN
INTEGER LINK, PTR, PLIGHT, USYMB, WASSYMB, VALPTR ; STRING DEFVAL ;
SIMPLE PROCEDURE CHECK!CONSISTENCY ;
	IF WASSYMB AND USYMB NEQ 0 AND LDB(IXN(WASSYMB)) NEQ LDB(IXN(ABS(USYMB))) THEN
		WARN("=",<"Label "&SYM[LINK]&" was cross-referenced as a "&
			SYM[WASSYMB]&" but is being defined as a "&
			SYM[ABS(USYMB)]>) ;
LINK ← 0 ; 
DO	BEGIN "MULTIPLE LABELS"
	PTR ← SYMNUM(THISWD&":") ;  BYTEWD ← NUMBER[PTR] ;
	IF BYTEWD=0 OR ( PLIGHT ← LDB(PLIGHTWD(BYTEWD)) ) = 1 THEN
		BEGIN NUMBER[PTR] ← BYTEWD LSH 13 LOR LINK ;  LINK ← PTR END
	ELSE WARN("=",<"Label "&SYM[PTR]&" is already defined as "&
		(IF PLIGHT=2 THEN STBL[IX] ELSE "a recent page number")>) ;
	PASS ; PASS ;
	END "MULTIPLE LABELS"
UNTIL  NOT (THISISID AND NEXTSCH(:)) ;
IF LINK = 0 THEN RETURN(TRUE) ; TES 11/29/73 ;
DEFVAL ← IF (USYMB←NEXTSTATEMENT)=0 THEN E(0,0)
	 ELSE IF USYMB>TWO(13) THEN "??"
	 ELSE IF USYMB>0 THEN C! ELSE !;
IF EQU(DEFVAL,0) OR USYMB = SYMPAGE THEN
DO	BEGIN "PAGE LABELS"
	NUMBER[LINK] SWAP PLBL ;  WASSYMB ← PLBL LSH -13 ;
	CHECK!CONSISTENCY ;
	PLBL SWAP LINK ;  LINK ← LINK LAND '17777 ;  PLBL ← -PLBL ;
	END "PAGE LABELS"
UNTIL LINK=0
ELSE	BEGIN "OTHER COUNTER"
	IF XCRIBL THEN COMPMAXIMS ; TES 11/2/74 SO XLENGTH WON'T COMPLAIN ;
	VALPTR ← 2 ROT -2 LOR PUTS(DEFVAL&(IF XCRIBL THEN ALTMODE&CVS(XLENGTH(DEFVAL)) ELSE NULL)) ;
	DO	BEGIN
		PTR ← VALPTR ;  NUMBER[LINK] SWAP PTR ;  WASSYMB ← PTR LSH -13 ;
		CHECK!CONSISTENCY ;
		LINK ← PTR LAND '17777 ;
		END
	UNTIL LINK=0 ;
	END "OTHER COUNTER" ;
RETURN(TRUE) ;
END "LABELDEF" ;
PUBLIC STRING SIMPLE PROCEDURE LABELREF(INTEGER USYMB, LEN) ;$"#
IF  NOT ON THEN RETURN(NULL) ELSE
BEGIN "LABELREF"
INTEGER PTR, PLIGHT, WASSYMB ; STRING S ;
IF NULSTR(THISWD) THEN COMMENT, Generated Label for {PAGE}. USYMB=0.;
	PTR ← (PLBL ← PUTI(1, PLBL)) LOR TWO(14)   COMMENT Add to Linked List ;
ELSE IF BYTEWD ← NUMBER[ PTR ← SYMNUM(THISWD & ":") ] THEN
	BEGIN "KNOWN LABEL"
	CASE (PLIGHT ← LDB(PLIGHTWD(BYTEWD))) MOD 3 OF
		BEGIN COMMENT BY PLIGHT ;
		COMMENT 0 or 3 ... Page Label still Uncertain ; WASSYMB ← SYMPAGE ;
		COMMENT 1 ... Referenced but not defined ; WASSYMB ← LDB(IXWD(BYTEWD)) ;
		COMMENT 2 ... Defined and Certain ;
			BEGIN
			BREAKSET(LOCAL!TABLE,ALTMODE,"IS");
			BREAKSET(LOCAL!TABLE,NULL,"O");
			S ← STBL[LDB(IXWD(BYTEWD))] ;
			RETURN (SCAN(S,LOCAL!TABLE,DUMMY));
			END;
		END ; COMMENT BY PLIGHT ;
	IF USYMB AND LDB(IXN(USYMB)) NEQ LDB(IXN(WASSYMB)) THEN
		BEGIN "DIFFERENT COUNTER"
		IF WASSYMB THEN WARN("X-REF ERROR",<"Label "&SYM[PTR]&
			" was cross-referenced as a "&SYM[WASSYMB]&
			" earlier, but now as a "&SYM[USYMB]>) ;
		IF PLIGHT = 1 THEN NUMBER[PTR] ← 1 ROT -2 LOR USYMB ;
		END "DIFFERENT COUNTER" ;
	END "KNOWN LABEL"
ELSE NUMBER[PTR] ← 1 ROT -2 LOR USYMB ;
RETURN(RUBOUT & CVS(LEN) & VT & CVS(PTR) & VT) ;
END "LABELREF" ;
FINISHED

ENDOF("XREFS")